﻿package Graficos 
{
	
	import flash.display.*;
	import flash.events.*;
	
	public class GraficoNormal extends Grafico
	{
		static var camara:Punto3d = new Punto3d(0,0,127);
		
		protected var normalMap:BitmapData;
		protected var currentFlare:Flare;
		
		private const DISTANCIA_ANGULAR_MAXIMA:Number = 3*127*127;//CUADRADA!
		
		//----
		
		private var vectorLuz:Punto3d;
		
		private var bufferedValue:uint;
		private var cacheHit:Boolean;
		
		public function GraficoNormal(unFlare:Flare)
		{
			super ();
			
			difusaTextura = new BDDifuso6(1,1);			
			currentFlare = unFlare;
			normalMap = new BDNormal6(1,1);		
		}
		
		protected function setVectoresLuz ()
		{
			cacheHit = false;
			vectorLuz = currentFlare.getVectorLuzNormalizado(bitmap.x+bitmap.width/2,bitmap.y+bitmap.height/2,0);
		}
		
		override protected function getSombraTexturaPixel(xx:Number, yy:Number):uint
		{
			/*----CACHE!
			if (cacheHit)
			{
				cacheHit = false;
				return bufferedValue;
			}*/
			//----
			var vectorNormalPixel:Punto3d = getPixelNormal(xx,yy);
			var vectorLuzReflejada:Punto3d = getVectorLuzReflejoAproximacion(vectorLuz,vectorNormalPixel);			
			var cateto:Punto3d = vectorLuzReflejada.restar(camara.x,camara.y,camara.z);
			var alfa:Number = 0;
			var beta:Number = 0;
			//----
			if (cateto.distanciaCuadrada()<=DISTANCIA_ANGULAR_MAXIMA)
			{
				alfa = cateto.distanciaCuadrada()/DISTANCIA_ANGULAR_MAXIMA;						
				if (alfa>1)
				{
					alfa=1;
				}
			}
			else
			{
				alfa=DISTANCIA_ANGULAR_MAXIMA;
			}
			//----
			beta = 1-alfa;
			//beta *= 1.2;
			cacheHit = true;
			bufferedValue = 255*beta;
			return bufferedValue;
		}
		
		protected function getPixelNormal (xx:Number,yy:Number):Punto3d
		{
			var r:uint = 0;
			var g:uint = 0;
			var b:uint = 0;
			//----
			var color:uint = normalMap.getPixel(xx,yy);
			b=color & 255;
			g=(color >> 8) & 255;
			r=(color >> 16) & 255;
			//----
			var pRet:Punto3d = new Punto3d (r-128,g-128,b-128);//SHORT [-128..+127]
			return pRet;
		}
		
		private function getVectorLuzReflejoAproximacion(l:Punto3d, n:Punto3d):Punto3d
		{
			var ll:Punto3d = null;
			ll = n.multiplicacionEscalar(0.5);
			ll = ll.restar(l.x,l.y,l.z);
			return ll;
		}
		
		override public function paint()
		{
			setVectoresLuz();
			super.paint();				
		}
		
		
	}
	
}